from datetime import datetime
from typing import List, Optional, Generic, TypeVar, Dict, Any

from pydantic import BaseModel, Field, field_serializer


# 用户基础模型
class UserBase(BaseModel):
    username: str
    email: str
    full_name: Optional[str] = None


# 创建用户请求模型
class UserCreate(UserBase):
    pass


# 更新用户请求模型
class UserUpdate(UserBase):
    username: Optional[str] = None
    email: Optional[str] = None
    full_name: Optional[str] = None


class OrderBase(BaseModel):
    product: str
    amount: float


class OrderResponse(OrderBase):
    id: int
    # user_id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True

    # 使用字段序列化器处理datetime格式
    @field_serializer('created_at', 'updated_at')
    def serialize_datetime(self, dt: datetime) -> str:
        return dt.strftime('%Y-%m-%d %H:%M:%S')


# 用户响应模型
class UserResponse(UserBase):
    id: int
    created_at: datetime
    updated_at: datetime
    orders: List[OrderResponse] = []

    '''
    如果没有设置 from_attributes=True，Pydantic 模型默认期望传入的数据是字典形式
    当我们设置 from_attributes=True 时，Pydantic 模型会尝试从对象的属性中提取数据
    from_attributes=True 配置使得 Pydantic 模型能够方便地处理从 ORM 模型获取的数据，
    避免了手动将 ORM 对象转换为字典的繁琐过程，提高了代码的简洁性和可维护性。
    '''

    class Config:
        from_attributes = True

    # 使用字段序列化器处理datetime格式
    @field_serializer('created_at', 'updated_at')
    def serialize_datetime(self, dt: datetime) -> str:
        return dt.strftime('%Y-%m-%d %H:%M:%S')

    # # 对datetime进行字符串格式化,还可以对参数进行检查
    # @model_validator(mode="after")
    # def format_datetime(cls, values):
    #     # 格式化 created_at 字段
    #     if hasattr(values, 'created_at'):
    #         values.created_at = values.created_at.strftime('%Y-%m-%d %H:%M:%S')
    #     # 格式化 updated_at 字段
    #     if hasattr(values, 'updated_at'):
    #         values.updated_at = values.updated_at.strftime('%Y-%m-%d %H:%M:%S')
    #     return values


class UpdateUserResponse(UserBase):
    id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True

    # 使用字段序列化器处理datetime格式
    @field_serializer('created_at', 'updated_at')
    def serialize_datetime(self, dt: datetime) -> str:
        return dt.strftime('%Y-%m-%d %H:%M:%S')


# 分页查询参数模型
class PaginationParams(BaseModel):
    page: int = Field(1, ge=1, description="页码，从1开始")
    size: int = Field(10, ge=1, le=100, description="每页记录数，1-100之间")


# 定义泛型类型变量
T = TypeVar('T')


# 分页响应模型（泛型）
class PaginationResponse(Generic[T]):
    def __init__(self, items: List[T], total: int, page: int, size: int):
        self.items = items
        self.total = total
        self.page = page
        self.size = size
        self.pages = (total + size - 1) // size if total > 0 else 0
        self.has_next = page < self.pages
        self.has_prev = page > 1

    def dict(self) -> Dict[str, Any]:
        return {
            "items": self.items,
            "total": self.total,
            "page": self.page,
            "size": self.size,
            "pages": self.pages,
            "has_next": self.has_next,
            "has_prev": self.has_prev
        }
